﻿// Decompiled with JetBrains decompiler
// Type: Microsoft.InfoCards.SafeRsaProviderHandle
// Assembly: infocard, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: 8E14765A-6610-409A-BA36-099A0642905D
// Assembly location: E:\git\ALLIDA\windll\infocard.exe

using Microsoft.InfoCards.Diagnostics;
using System;
using System.ComponentModel;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Security;

namespace Microsoft.InfoCards
{
  internal class SafeRsaProviderHandle : SafeHandle
  {
    [SuppressUnmanagedCodeSecurity]
    [DllImport("advapi32.dll", EntryPoint = "CryptAcquireContextW", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern bool CryptAcquireContext(
      out SafeRsaProviderHandle hProv,
      [In] string pszContainer,
      [In] string pszProvider,
      [In] uint dwProvType,
      [In] uint dwFlags);

    [SuppressUnmanagedCodeSecurity]
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern bool CryptReleaseContext([In] IntPtr hProv, [In] uint dwFlags);

    public static SafeRsaProviderHandle Construct()
    {
      SafeRsaProviderHandle hProv;
      if (!SafeRsaProviderHandle.CryptAcquireContext(out hProv, (string) null, (string) null, 24U, 4026531840U))
      {
        Win32Exception win32Exception = new Win32Exception(Marshal.GetLastWin32Error());
        InfoCardTrace.CloseInvalidOutSafeHandle((SafeHandle) hProv);
        InfoCardTrace.TraceAndLogException((Exception) win32Exception);
        throw InfoCardTrace.ThrowHelperError((Exception) new CommunicationException(win32Exception.Message));
      }
      return hProv;
    }

    private SafeRsaProviderHandle()
      : base(IntPtr.Zero, true)
    {
    }

    public override bool IsInvalid
    {
      get
      {
        return IntPtr.Zero == this.handle;
      }
    }

    protected override bool ReleaseHandle()
    {
      return SafeRsaProviderHandle.CryptReleaseContext(this.handle, 0U);
    }
  }
}
